#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
昇腾大模型Web界面服务
提供昇腾大模型的Web用户界面
"""

import os
import sys
import json
import time
import logging
import argparse
from typing import Dict, List, Any, Optional, Union

import requests
from flask import Flask, request, jsonify, render_template, Response
from flask_cors import CORS

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.StreamHandler(sys.stdout)
    ]
)
logger = logging.getLogger(__name__)

# 创建Flask应用
app = Flask(__name__, 
            static_folder='static',
            template_folder='templates')
app.secret_key = os.urandom(24)  # 设置密钥

# 添加CORS支持
CORS(app)

# 全局变量
API_URL = "http://localhost:8000"


# 主页路由
@app.route('/')
def index():
    """返回主页"""
    return render_template('index.html')


# API代理路由 - 聊天
@app.route('/api/proxy/chat', methods=['POST'])
def chat_proxy():
    """代理转发聊天请求到API服务"""
    try:
        # 获取请求JSON
        req_data = request.get_json()
        
        if not req_data:
            return jsonify({"error": "无效的请求数据"}), 400
        
        # 转发请求到API服务
        api_response = requests.post(
            f"{API_URL}/chat",
            json=req_data,
            timeout=120  # 较长的超时时间，以适应长时间推理
        )
        
        # 检查响应状态
        api_response.raise_for_status()
        
        # 返回API响应
        return jsonify(api_response.json())
        
    except requests.RequestException as e:
        logger.error(f"API请求错误: {str(e)}")
        return jsonify({"error": f"API服务错误: {str(e)}"}), 502
    except Exception as e:
        logger.error(f"处理请求时出错: {str(e)}")
        return jsonify({"error": f"服务器内部错误: {str(e)}"}), 500


# API代理路由 - 健康检查
@app.route('/api/proxy/health', methods=['GET'])
def health_proxy():
    """代理转发健康检查请求到API服务"""
    try:
        # 转发请求到API服务
        api_response = requests.get(
            f"{API_URL}/health",
            timeout=5
        )
        
        # 检查响应状态
        api_response.raise_for_status()
        
        # 返回API响应
        return jsonify(api_response.json())
        
    except requests.RequestException as e:
        logger.error(f"API健康检查错误: {str(e)}")
        return jsonify({
            "status": "error",
            "reason": f"API服务连接失败: {str(e)}"
        }), 502
    except Exception as e:
        logger.error(f"健康检查时出错: {str(e)}")
        return jsonify({
            "status": "error",
            "reason": f"服务器内部错误: {str(e)}"
        }), 500


# API代理路由 - 性能指标
@app.route('/api/proxy/metrics', methods=['GET'])
def metrics_proxy():
    """代理转发性能指标请求到API服务"""
    try:
        # 转发请求到API服务
        api_response = requests.get(
            f"{API_URL}/metrics",
            timeout=5
        )
        
        # 检查响应状态
        api_response.raise_for_status()
        
        # 返回API响应
        return jsonify(api_response.json())
        
    except requests.RequestException as e:
        logger.error(f"API指标请求错误: {str(e)}")
        return jsonify({"error": f"API服务错误: {str(e)}"}), 502
    except Exception as e:
        logger.error(f"处理指标请求时出错: {str(e)}")
        return jsonify({"error": f"服务器内部错误: {str(e)}"}), 500


def parse_args():
    """解析命令行参数"""
    parser = argparse.ArgumentParser(description="昇腾大模型Web界面")
    
    parser.add_argument("--api_url", type=str, default="http://localhost:8000",
                        help="API服务地址，默认为http://localhost:8000")
    
    parser.add_argument("--host", type=str, default="0.0.0.0",
                        help="Web服务主机地址")
    
    parser.add_argument("--port", type=int, default=8080,
                        help="Web服务端口号")
    
    parser.add_argument("--debug", action="store_true",
                        help="启用调试模式")
    
    return parser.parse_args()


def main():
    """主函数"""
    # 解析命令行参数
    args = parse_args()
    
    # 设置全局API URL
    global API_URL
    API_URL = args.api_url
    
    try:
        # 启动Web服务
        app.run(
            host=args.host,
            port=args.port,
            debug=args.debug,
            use_reloader=args.debug
        )
    except KeyboardInterrupt:
        logger.info("接收到关闭信号，正在关闭服务...")
    except Exception as e:
        logger.error(f"启动Web服务时出错: {str(e)}")
        sys.exit(1)


if __name__ == "__main__":
    main() 